/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Model.ComboGenericModel;
import Model.FornecedorModel;
import Model.MarcaModel;
import Model.ProdutoModel;
import Model.StatusModel;
import Utils.HibernateUtil;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.*;

/**
 *
 * @author Thiago
 */
public class ProdutoDaoImp implements ProdutoDao {

    /**
     * @description Salva um produto
     * @param produto (objeto produto)
     * @return
     * @author Thiago Cezar Silverio
     */
    public void save(ProdutoModel produto) {
        try {
            Session session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();
            session.save(produto);
            session.getTransaction().commit();
        } catch (Exception ex) {
            String erro = ex.getMessage();
        }

    }

    /**
     * @description remove um produto
     * @param produto (objeto produto)
     * @return
     * @author Thiago Cezar Silverio
     */
    public void remove(ProdutoModel produto) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.delete(produto);
        session.getTransaction().commit();
    }

    /**
     * @description altera um produto
     * @param produto (objeto produto)
     * @return
     * @author Thiago Cezar Silverio
     */
    public void update(ProdutoModel produto) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();
        session.update(produto);
        session.getTransaction().commit();
    }

    /**
     * @description busca um produto
     * @param id (identiificador do produto)
     * @return ProdutoModel (objeto produto)
     * @author Thiago Cezar Silverio
     */
    public ProdutoModel getProduto(int id) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        return (ProdutoModel) session.load(ProdutoModel.class, id);
    }

    /**
     * @description busca todos os produto
     * @param
     * @return lista (lista de objetos produto)
     * @author Thiago Cezar Silverio
     */
    public List<ProdutoModel> getTodos() {
        List<ProdutoModel> listaProduto = new ArrayList<ProdutoModel>();
        ProdutoDao dao = new ProdutoDaoImp();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List query = session.createSQLQuery("select idproduto from itemproduto").list();
        // obtém os fornecedores contidos no Vector
        for (int i = 0; i < query.size(); i++) {
            String valor = query.get(i).toString();
            listaProduto.add(dao.getProduto(Integer.parseInt(valor)));
        }
        return listaProduto;
    }
    
    /**
     * @description busca de atributos para popular combos
     * @param
     * @return lista (lista de objetos ComboGenericModel)
     * @author Thiago Cezar Silverio
     */
    public List<ComboGenericModel> getMarcaProduto() {
        List<ComboGenericModel> listaProduto = new ArrayList<ComboGenericModel>();
        MarcaModel marca = new MarcaModel();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List query = session.createSQLQuery("select idmarca from produto group by idmarca").list();
        // obtém os fornecedores contidos no Vector
        for (int i = 0; i < query.size(); i++) {
            int id = Integer.parseInt(query.get(i).toString());
            marca = (MarcaModel) session.load(MarcaModel.class, id);
            ComboGenericModel combo = new ComboGenericModel(marca.getIdmarca(), marca.getDescricao());
            listaProduto.add(combo);
        }
        return listaProduto;
    }

    public List<ComboGenericModel> getFornecedorProduto() {
        List<ComboGenericModel> listaProduto = new ArrayList<ComboGenericModel>();
        FornecedorModel forn = new FornecedorModel();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List query = session.createSQLQuery("select idfornecedor from produto group by idfornecedor").list();
        // obtém os fornecedores contidos no Vector
        for (int i = 0; i < query.size(); i++) {
            int id = Integer.parseInt(query.get(i).toString());
            forn = (FornecedorModel) session.load(FornecedorModel.class, id);
            ComboGenericModel combo = new ComboGenericModel(forn.getIdfornecedor(),forn.getNomefornecedor());
            listaProduto.add(combo);
        }
        return listaProduto;
    }

    public List<ComboGenericModel> getStatusProduto() {
        List<ComboGenericModel> listaProduto = new ArrayList<ComboGenericModel>();
        StatusModel status = new StatusModel();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction t = session.beginTransaction();
        List query = session.createSQLQuery("select idstatus from produto group by idstatus").list();
        // obtém os fornecedores contidos no Vector
        for (int i = 0; i < query.size(); i++) {
            int id = Integer.parseInt(query.get(i).toString());
            status = (StatusModel) session.load(StatusModel.class, id);
            ComboGenericModel combo = new ComboGenericModel(status.getIdstatus(),status.getDescricao());
            listaProduto.add(combo);
        }
        return listaProduto;
    }

    public List<ComboGenericModel> getDataValidade() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<ComboGenericModel> getUnidadeMedida() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
